#include <stdio.h>

// 我们知道了一元多项式的表示，那么二元多项式该怎么表示呢？
// 可以使用广义表（更加复杂的链表）

typedef struct GNode *GList;
struct GNode
{
    int Tag; // 由于结点有可能是单元素也可能是另一个广义表，就用tag来标记。tag为0是单元素，为1是广义表
    union
    { // 子表指针域SubList与单元素数据域Data复用，即公用存储空间。
        int Data;
        GList SubList;
    } URegion;  // 联合成员不是彼此并存的，任一时刻联合变量中只含有其中一个成员，该成员是最近一次存入联合的那个。
    GList next; // 指向后继结点
};

// 接下来我们考虑表示矩阵
// 对于“稀疏矩阵”，常规的二维数组表示将造成大量的存储空间浪费。

// 结点的数据域：Row,Col,Value
// 每个结点通过两个指针域，把同行和同列穿起来

typedef enum
{
    Head,
    Term
} NodeTag;//表示head结点和term结点

struct TermNode{//非零元素结点
    int row, col;
    int Value;
};

typedef struct MNode *PtrToNode;
struct MNode{
    PtrToNode Down, Right;
    NodeTag Tag;
    union{//Head对应Next指针，Term对应非零元素结点
        PtrToNode Next;
        struct TermNode Term;
    } URegion;
};
